技術問答
技術文章
iT 徵才
Tag
聊天室
2024 鐵人賽
登入/註冊
問答
文章
Tag
邦友
鐵人賽
搜尋
2024 iThome 鐵人賽
DAY
26
0
佛心分享-IT 人自學之術
Python學習馬拉松:30天挑戰
系列 第
26
篇
Day26. 實作練習:Binary Search
16th鐵人賽
sheep
2024-10-10 22:24:09
94 瀏覽
分享至
教學來源:https://www.youtube.com/watch?v=8ext9G7xspg
這段程式碼的目的是比較兩種不同的搜尋方法(naive search 和 binary search)的效能,用來尋找目標值在一個排序過的列表中的位置。這裡的重點是「二分搜尋法(binary search)」,它是一種高效的搜尋演算法,特別是在已經排序的列表中。
程式碼與執行結果:
程式碼說明:
naive_search 函數:
◆ 這是最簡單的搜尋方式,叫做「線性搜尋」,它會從列表的第一個元素開始,逐個比對,直到找到目標值或是列表的最後一個元素。
◎ l是排序好的列表。
◎ target 是你想要搜尋的目標值。
◎ 程式會逐一檢查列表中的每個元素,當發現某個元素與目標值相等時,會回傳該元素的索引(位置)。
◎ 如果找不到目標值,會回傳 -1 表示失敗。
binary_search 函數:
◆ 這是二分搜尋法,透過不斷將搜索範圍縮小一半來尋找目標值,比線性搜尋更有效率,但前提是列表必須事先排好順序。
◎ l是排序好的列表。
◎ target 是你想要搜尋的目標值。
◎ low 和 high 定義了當前搜尋的範圍。如果第一次呼叫時沒有給定,會默認範圍是整個列表(從 0 到 len(l)-1)。
◆ 函數會計算目前範圍的中點 midpoint,並根據目標值與中點值的大小關係決定下一步:
◎ 如果中點值等於目標值,回傳中點位置。
◎ 如果目標值小於中點值,繼續在左半邊(從 low 到 midpoint-1)進行搜尋。
◎ 如果目標值大於中點值,則在右半邊(從 midpoint+1 到 high)繼續搜尋。
◆如果 low 大於 high,表示目標值不存在於列表中,回傳 -1。
主程式:
◆ 主程式的主要任務是生成一個隨機的、排序過的列表,然後分別用線性搜尋和二分搜尋來尋找每個目標值,並測量每種搜尋方法的執行時間。
◎ 首先,程式生成一個長度為 1000 的隨機數列表,這些數值的範圍在 -3000 到 3000 之間,然後將這個列表進行排序。
◎ 接著,使用 naive_search 和 binary_search 兩種方法來搜尋列表中的每個數字,並計算每次搜尋所花費的時間。
◎ 最後,輸出每次搜尋的平均時間,來比較哪種方法更快。
核心比較
◆ 線性搜尋的時間複雜度是 O(n),因為它需要檢查列表中的每個元素。
◆二分搜尋的時間複雜度是 O(log n),因為每次搜尋時,範圍會縮小一半,所以在大列表中它會比線性搜尋快很多。
留言
追蹤
檢舉
上一篇
Day25. 實作練習:圈圈叉叉Tic-Tac-Toe
下一篇
Day27. 實作練習:踩地雷遊戲 Minesweeper
系列文
Python學習馬拉松:30天挑戰
共
30
篇
目錄
RSS系列文
訂閱系列文
2
人訂閱
26
Day26. 實作練習:Binary Search
27
Day27. 實作練習:踩地雷遊戲 Minesweeper
28
Day28. 實作練習:數獨解決器Sudoku Solver
29
Day29. 實作練習:圈圈叉叉Tic-Tac-Toe --AI
30
Day30. 實作練習:馬可夫鏈文本生成器 Markov Chain Text Composer
完整目錄
直播研討會
{{ item.subject }}
{{ item.channelVendor }}
{{ item.webinarstarted }}
|
{{ formatDate(item.duration) }}
直播中
立即報名
尚未有邦友留言
立即登入留言
iThome鐵人賽
參賽組數
1064
組
團體組數
40
組
累計文章數
22195
篇
完賽人數
600
人
看影片追技術
看更多
{{ item.subject }}
{{ item.channelVendor }}
|
{{ formatDate(item.duration) }}
直播中
熱門tag
看更多
15th鐵人賽
16th鐵人賽
13th鐵人賽
14th鐵人賽
12th鐵人賽
11th鐵人賽
鐵人賽
2019鐵人賽
javascript
2018鐵人賽
python
2017鐵人賽
windows
php
c#
windows server
linux
css
react
vue.js
熱門問題
請問內網IP如何轉外網IP?
新手學習編程,哪種編程語言好?
如何寫公式才能利用excel 觸發一個數據時傳送一個訊息給 自已的line呢?有沒有可以用其它方式,來取代line notify 的方法,因為line 開始收費
Windows7升級Windows10後網路功能異常
python爬蟲 動態生成網頁104人力銀行
區域網路問題提問
vmware 虛擬機(windows)裡顯示使用容量與實際檔案容量不符合
防火牆與DNS請教
FORTI 防火牆使用 RADIUS 認證問題請教
2台 Hyper-V 2008 R2 叢集主機(硬體規格相同), 如何加入一台新機? 謝謝.
熱門回答
請問內網IP如何轉外網IP?
防火牆與DNS請教
這樣的物件設計好嗎?
新手學習編程,哪種編程語言好?
SDX-500電話主機 Fortinet FG-100F port開啟問題
熱門文章
每日一篇學習筆記 直到我做完專題 :( [Day33]
每日一篇學習筆記 直到我做完專題 :( [Day34]
每日一篇學習筆記 直到我做完專題 :( [Day35]
每日一篇學習筆記 直到我做完專題 :( [Day36]
Python 爬蟲系列:定位 find , select
IT邦幫忙
×
標記使用者
輸入對方的帳號或暱稱
Loading
找不到結果。
標記
{{ result.label }}
{{ result.account }}